import os
from datetime import datetime
import MyException
import Config
import MyUtil


#  检查者
def check_datatime_for_datetype(datetype, datatime):
    """
       根据 datetype 校验 datatime 是否合法。

       参数:
       datetype (str): 日期类型，可以是 'day', 'month', 或 'year'。
       datatime (str): 日期时间字符串。

       抛出:
       InvalidDateTypeError: 如果 datetype 无效。
       InvalidDateTimeFormatError: 如果 datatime 格式不正确。
       """
    if datetype not in ['day', 'month', 'year']:
        raise MyException.InvalidDateTypeError(f"无效的日期类型: {datetype}")

    if datetype == 'day':
        if len(datatime) != 8:
            raise MyException.InvalidDateTimeFormatError("对于 'day' 类型，日期时间格式必须为 'yyyyMMdd'")
        try:
            datetime.strptime(datatime, '%Y%m%d')
        except ValueError:
            raise MyException.InvalidDateTimeFormatError("对于 'day' 类型，日期时间格式不正确")
    elif datetype == 'month':
        if len(datatime) != 6:
            raise MyException.InvalidDateTimeFormatError("对于 'month' 类型，日期时间格式必须为 'yyyyMM'")
        try:
            datetime.strptime(datatime, '%Y%m')
        except ValueError:
            raise MyException.InvalidDateTimeFormatError("对于 'month' 类型，日期时间格式不正确")
    elif datetype == 'year':
        if len(datatime) != 4:
            raise MyException.InvalidDateTimeFormatError("对于 'year' 类型，日期时间格式必须为 'yyyy'")
        try:
            datetime.strptime(datatime, '%Y')
        except ValueError:
            raise MyException.InvalidDateTimeFormatError("对于 'year' 类型，日期时间格式不正确")


def check_count_file_exists_by_date_and_datetype(datetype, datatime):
    base_path = (f'{Config.COUNT_BUCKET_FILE_HOME_PATH}/{datetype}'
                 f'/{MyUtil.get_date_folder_path(datetype, datatime)}')
    for file_name in os.listdir(base_path):
        t = file_name.split('_')[0].replace(Config.COUNT_FILE_NAME_PREFIX, '')
        if t == datatime:
            return f'{base_path}/{file_name}'
    return False


def folder_exists(file_path):
    """
    检查文件是否存在。

    参数:
    file_path (str): 文件路径。

    返回:
    bool: 如果文件存在返回 True，否则返回 False。
    """
    if not os.path.exists(file_path):
        # 创建目录
        os.makedirs(os.path.dirname(file_path), exist_ok=True)
    return os.path.exists(file_path)


def get_file_last_modified_time(file_path):
    """
    获取文件的最后修改时间。

    参数:
    file_path (str): 文件路径。

    返回:
    str: 文件的最后修改时间，格式为 timestamp。
    """
    if not os.path.exists(file_path):
        return 0

    timestamp = os.path.getmtime(file_path)
    return timestamp


def check_day_count_need(record_file_path, count_file_path):
    """
    检查是否需要重新统计日数据。
    参数
    record_file_path：记录文件地址
    count_file_path：日统计文件地址
    返回值说明
    如果记录文件最后修改时间 > 日统计文件最后修改时间  则需要重新进行统计
    如果count文件不存在 get_file_last_modified_time 会返回 0 与主逻辑不冲突
    """
    record_file_last_modified_time = get_file_last_modified_time(record_file_path)
    count_file_last_modified_time = get_file_last_modified_time(count_file_path)
    return record_file_last_modified_time > count_file_last_modified_time
